package com.yunc.base.utils;

import cn.hutool.core.util.ArrayUtil;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author taocongcong
 * @create 2020-01-20 11:35
 */
public class ReflexUtils {

    /**
     * 反射根据属性名获取属性值
     *
     * @param fieldName 属性名
     * @param object    实体类对象
     * @return
     */
    public static Object getFieldValueByFieldName(String fieldName, Object object) {
        try {
            Field field = object.getClass().getDeclaredField(fieldName);
            // 设置对象的访问权限，保证对private的属性的访问
            field.setAccessible(true);
            return field.get(object);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 通过反射设置属性的值
     *
     * @param fieldName      属性名
     * @param fieldValue     属性值
     * @param object         实体类对象
     * @param parameterTypes 设置属性值的类型
     * @throws
     */
    public static void setFieldValueByFieldName(String fieldName, Object fieldValue, Object object, Class<?>... parameterTypes) {
        try {
            Field[] fields = object.getClass().getDeclaredFields();
            if (ArrayUtil.isEmpty(fields)) {
                return;
            }
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                // 字段名称
                String name = field.getName();
                if (StringUtils.equals(name, fieldName)) {
                    field.setAccessible(true);
                    // field.set(object,fieldValue) 可代替下面的拼接set方法;
                    // 将属性的首字符大写，方便构造get，set方法
                    String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
                    Method m = object.getClass().getMethod("set" + methodName, parameterTypes);
                    m.invoke(object, fieldValue);
                    return;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
